
#include <stdatomic.h>

typedef struct __lock_t { atomic_int flag; } lock_t;

void init(lock_t *mutex) {
	// 0 -> lock is available, 1 -> held
	mutex->flag = 0;
}

void lock(lock_t *mutex) 
{	
	int key = 0;
	// 如果 key == flag 的话，那么将 flag 设置为 1，返回 true
	// 如果 key != flag 的话，那么将 key 的值设置为 flag 中的值，返回 false
	while (!atomic_compare_exchange_strong(&mutex->flag, &key, 1)) // TEST the flag
	{ 
		key = 0;
		// spin-wait (do nothing)
	}
}

void unlock(lock_t *mutex) 
{
	mutex->flag = 0;
}

